//
//  NSDeta+Category.h
//  OCDemo
//
//  Created by zhumuzhi on 2021/3/22.
//


#define D_MINUTE    60
#define D_HOUR      3600
#define D_DAY       86400
#define D_WEEK      604800
#define D_YEAR      31556926


NS_ASSUME_NONNULL_BEGIN

@interface NSDate (Category)

#pragma mark - Descrition
- (NSString *)getCurrentDateTime;
- (NSString *)timeIntervalDescription;//距离当前的时间间隔描述
- (NSString *)minuteDescription;/*精确到分钟的日期描述*/
- (NSString *)formattedTime;/*标准时间日期描述*/
- (NSString *)formattedDateDescription;//格式化日期描述
- (double)timeIntervalSince1970InMilliSecond;
+ (NSDate *)dateWithTimeIntervalInMilliSecondSince1970:(double)timeIntervalInMilliSecond;
+ (NSString *)formattedTimeFromTimeInterval:(long long)time;//时间戳转当前时间

#pragma mark - Relative Dates
// Relative dates from the current date
+ (NSDate *) dateTomorrow;
+ (NSDate *) dateYesterday;
+ (NSDate *) dateWithDaysFromNow: (NSInteger) days;
+ (NSDate *) dateWithDaysBeforeNow: (NSInteger) days;
+ (NSDate *) dateWithHoursFromNow: (NSInteger) dHours;
+ (NSDate *) dateWithHoursBeforeNow: (NSInteger) dHours;
+ (NSDate *) dateWithMinutesFromNow: (NSInteger) dMinutes;
+ (NSDate *) dateWithMinutesBeforeNow: (NSInteger) dMinutes;
- (NSDate *) dateAfterMonth:(int)month;

#pragma mark - Comparing Dates
// Comparing dates
- (BOOL) isEqualToDateIgnoringTime: (NSDate *) aDate;
- (BOOL) isToday;
- (BOOL) isTomorrow;
- (BOOL) isYesterday;
- (BOOL) isSameWeekAsDate: (NSDate *) aDate;
- (BOOL) isThisWeek;
- (BOOL) isNextWeek;
- (BOOL) isLastWeek;
- (BOOL) isSameMonthAsDate: (NSDate *) aDate;
- (BOOL) isThisMonth;
- (BOOL) isSameYearAsDate: (NSDate *) aDate;
- (BOOL) isThisYear;
- (BOOL) isNextYear;
- (BOOL) isLastYear;
- (BOOL) isEarlierThanDate: (NSDate *) aDate;
- (BOOL) isLaterThanDate: (NSDate *) aDate;
- (BOOL) isInFuture;
- (BOOL) isInPast;

#pragma mark - Date Roles
// Date roles
- (BOOL) isTypicallyWorkday;
- (BOOL) isTypicallyWeekend;

#pragma mark - Adjusting Dates
// Adjusting dates
- (NSDate *) dateByAddingDays: (NSInteger) dDays;
- (NSDate *) dateBySubtractingDays: (NSInteger) dDays;
- (NSDate *) dateByAddingHours: (NSInteger) dHours;
- (NSDate *) dateBySubtractingHours: (NSInteger) dHours;
- (NSDate *) dateByAddingMinutes: (NSInteger) dMinutes;
- (NSDate *) dateBySubtractingMinutes: (NSInteger) dMinutes;
- (NSDate *) dateAtStartOfDay;

#pragma mark - Restrieving Intervals
// Retrieving intervals
- (NSInteger) minutesAfterDate: (NSDate *) aDate;
- (NSInteger) minutesBeforeDate: (NSDate *) aDate;
- (NSInteger) hoursAfterDate: (NSDate *) aDate;
- (NSInteger) hoursBeforeDate: (NSDate *) aDate;
- (NSInteger) daysAfterDate: (NSDate *) aDate;
- (NSInteger) daysBeforeDate: (NSDate *) aDate;
- (NSInteger) distanceInDaysToDate:(NSDate *)anotherDate;

#pragma mark - Decomposing Dates
// Decomposing dates
@property (readonly) NSInteger nearestHour;
@property (readonly) NSInteger hour;
@property (readonly) NSInteger minute;
@property (readonly) NSInteger seconds;
@property (readonly) NSInteger day;
@property (readonly) NSInteger month;
@property (readonly) NSInteger week;
@property (readonly) NSInteger weekday;
@property (readonly) NSInteger nthWeekday; // e.g. 2nd Tuesday of the month == 2
@property (readonly) NSInteger year;


#pragma mark Other

/**
 *  得到当前时间的时间戳,13位毫秒级
 *
 *
 *  @return 得到时间戳字符串
 */
+ (NSString*)getCurrentTime;

/**
 *  NSDate时间转换为13位毫秒级时间戳
 *
 *  @param date 时间
 *
 *  @return 13位毫秒级时间戳
 */
+ (NSString *)convertTimeStampWithDate:(NSDate *)date;

/**
 *  NSDate类型时间转换为需要显示的时间字符串
 *
 *  @param date          NSDate类型时间
 *  @param newFormatter  日期格式 如：yyyy年MM月dd日
 *
 *  @return 得到相应的时间字符串
 */
+ (NSString *)stringWithDate:(NSDate *)date formatterString:(NSString *)newFormatter;

/**
 * NSString类型转换为所需要的时间NSDate
 * @param string        时间字符串
 * @param newFormatter  日期格式 如:yyyy-MM-dd
 *
 * @return 得到相应的时间NSDate
 */
+ (NSDate *)datewWithString:(NSString *)string formatterString:(NSString *)newFormatter;

/**
 *  时间字符串转换为需要显示的时间字符串
 *
 *  @param oldTime      原时间字符串
 *  @param oldFormatter 原时间日期格式 如：yyyy年MM月dd日
 *  @param newFormatter 新时间日期格式 如：yyyy年MM月dd日
 *
 *  @return 得到相应的时间字符串
 */
+ (NSString *)stringWithString:(NSString *)oldTime timeStringFormatter:(NSString *)oldFormatter formatterString:(NSString *)newFormatter;

/**
 *  时间戳字符串转换为需要的时间字符串
 *
 *  @param oldTime      时间戳 10位毫秒级
 *  @param newFormatter 日期格式 如：yyyy年MM月dd日
 *
 *  @return 得到相应的时间字符串
 */
+ (NSString *)stringWithDateString:(NSString *)oldTime formatterString:(NSString *)newFormatter;

/**
 时间字符串转换为NSDate
 
 @param oldTime      时间戳字符串 10位
 
 @return 得到对应的NSDate
 */
+ (NSDate *)dateWithString:(NSString *)oldTime;

/**
 时间字符转换为13位时间戳
 
 @param formatTime 时间字符
 @param format 日期格式 如：yyyy年MM月dd日
 @return 13位时间戳
 */
+ (NSString *)timeSwitchTimestamp:(NSString *)formatTime andFormatter:(NSString *)format;

/**
 带T的时间字符串转换为显示的时间字符串（2020-01-07T09:15:46.000+0000）
 
 @param string  时间字符（2020-01-07T09:15:46.000+0000）
 @return 时间字符串
 */
+ (NSString *)changeStringToDate:(NSString *)string;

/**
 *  项目使用，根据该日期返回一个字符串
 *  当天显示：12：35；
 *  前一天显示：昨天；
 *  除当天和昨天的今年日期：7月6日
 *  今年之前的日期：2014年1月23日
 *  @return 返回字符串
 */
- (NSString *)convertNSDate2String;

/**
 *  项目使用，获取当前日期和周几
 *
 *  @param date   NSDate
 *
 *  @return 项目使用，获取当前日期和周几 eg:12月19日[周五]
 */
+ (NSString *)getDateAndWeek:(NSDate *)date;

/**
 *  项目使用，获取当前的小时
 *
 *  @param serverTime   13位时间戳
 *
 *  @return 项目使用，获取当前的小时
 */
+ (NSInteger )getHourFromTime:(NSString *)serverTime;

/**
 判断是否是同一天
 
 @param date1 NSDate
 @param date2 NSDate
 @return YES or NO
 */
+ (BOOL)isSameDay:(NSDate *)date1 date2:(NSDate *)date2;

@end

NS_ASSUME_NONNULL_END
